package com.simple.create.factory.sample5;

/**
 * 券的抽象工厂类
 * 描述生产券, 需要的各种产品类型
 * 例如:  券名称, 券使用说明, 券类型
 * 再例如:
 * 联想公司想生产一台具体的电脑, 但电脑的产品线有很多, 比如 超极本 家用台式 等等 但这些都是联想的工厂中的两条产品线分别生产出来的,
 * 并且生产的过程中, 都需要将一些产品进行组装, 主板, cpu, 电源 等等  但这些cpu或者主板又有可能来自不同的厂家,Intel或者AMD
 * 具体到代码里, 怎么去描述这种产品的生产方式?
 * 比如要生产一台具体的家用台式机, 型号代码为abc,用的是Intel的i7-7700k 主板用的是MSI的B360M MORTAR
 * 首先,抽象出产品类型:
 * 新建一个Cpu.java的接口, 定义一个cpuType方法, 返回字符串代表型号
 * 新建一个MotherBoard.java的接口, 定义一个MbType方法, 返回字符串代表型号
 * 针对cpu有两种具体类型的, Intel或者AMD
 * 新建一个IntelCpu.java的类, 实现Cpu.java接口, 实现cpuType方法, 并返回字符串"i7-7700k"
 * 新建一个AMDCpu.java的类, 实现Cpu.java接口, 实现MbType方法, 并返回字符串"2600x"
 * 针对主板有两种具体类型的, MSI或者ASUS
 * 新建一个MSIMotherBoard.java的类, 实现MotherBoard.java接口, 实现MbType方法, 并返回字符串"B360M MORTAR"
 * 新建一个ASUSMotherBoard.java的类, 实现MotherBoard.java接口, 实现MbType方法, 并返回字符串"PRIME X470-PRO"
 * <p>
 * 其次,抽象出工厂类型:
 * 新建一个ComputerFactory.java的接口, 一个电脑需要cpu和主板
 * 定义一个createCpu方法, 返回Cpu
 * 定义一个createMotherBoard方法, 返回MotherBoard
 * <p>
 * 最后,针对具体的产品线:
 * 新建一个HomeComputerFactory.java的类, 实现ComputerFactory.java接口
 * 家用电脑产品线用的cpu是Intel的i7-7700k, 所以实现createCpu方法, 返回new IntelCpu();
 * 家用电脑产品线用的主板是MSI的B360M MORTAR, 所以实现createMotherBoard方法, 返回new MSIMotherBoard();
 * 新建一个ComComputerFactory.java的类, 实现ComputerFactory.java接口
 * 工作电脑产品线用的cpu是AMD的2600x, 所以实现createCpu方法, 返回new AMDCpu();
 * 工作电脑产品线用的主板是ASUS的PRIME X470-PRO, 所以实现createCpu方法, 返回new ASUSMotherBoard();
 * <p>
 * 这样就能生产这台家用电脑了
 * 使用HomeComputerFactory这个工厂类(产品线), 就能生产家用台式机
 * 使用ComComputerFactory这个工厂类(产品线), 就能生产工作台式机
 *
 * @author simple
 * @version 1.0
 * @date 2018/12/5 09:26
 * @since 1.0
 */
public interface CouponFactory {
    /**
     * 生产券名称
     *
     * @return 券名称
     */
    String createCouponName();

    /**
     * 生产券使用说明
     *
     * @return 使用说明
     */
    String createDesc();

    /**
     * 生产券类型
     *
     * @return 券类型
     * @see CouponType
     */
    CouponType createType();

    /**
     * 生产渠道
     *
     * @return 渠道
     * @see Channel
     */
    Channel createChannel();

    /**
     * 生产
     *
     * @return 具体产品
     */
    String create();
}
